package Init

import (
	"fmt"
	"strings"

	"github.com/spf13/viper"
)

// 配置文件语法类型
const configType = "toml"

var ConfEnvPath string //配置文件夹
var ConfEnv string     //配置环境名 比如：dev prod test

// 解析配置文件路径到 ConfEnvPath、ConfEnv 两个包变量中 （配置文件必须放到一个文件夹中）
// 如：config=conf/dev/base.json 	ConfEnvPath=conf/dev	ConfEnv=dev
// 如：config=conf/base.json		ConfEnvPath=conf		ConfEnv=conf
func ParseConfPath(config string) error {
	path := strings.Split(config, "/")
	prefix := strings.Join(path[:len(path)-1], "/")
	ConfEnvPath = prefix
	ConfEnv = path[len(path)-2]
	return nil
}

// 获取配置环境名
func GetConfEnv() string {
	return ConfEnv
}

// 组合环境+文件名+文件后缀
func GetConfPath(fileName string) string {
	return ConfEnvPath + "/" + fileName + "." + configType
}

func GetConfFilePath(fileName string) string {
	return ConfEnvPath + "/" + fileName
}

// 本地解析文件
func ParseLocalConfig(fileName string, st interface{}) error {
	path := GetConfFilePath(fileName)
	err := ParseConfig(path, st)
	if err != nil {
		return err
	}
	return nil
}

// 把指定配置文件中的内容映射到 conf 结构体上
func ParseConfig(path string, conf interface{}) error {
	v := viper.New()
	v.SetConfigType(configType)
	v.SetConfigFile(path)

	if err := v.ReadInConfig(); err != nil {
		return fmt.Errorf("Read In Config err:%v\n", err)
	}
	if err := v.Unmarshal(&conf); err != nil {
		return fmt.Errorf("parse config Unmarshal err:%v\n", err)
	}
	return nil
}
